﻿namespace PythonInvokerTest.Utils
{
    public class ConfigItem
    {
        public string SectionName = "Others";
        public string Key = null;
        public string Value = null;
        public bool IsSectionName = false;
        public bool IsValid = false;

        public ConfigItem() { }

        /// <summary>
        /// key 若长度小于1，则抛出异常。
        /// value 无限制。
        /// </summary>
        /// <param name="key">主键。</param>
        /// <param name="value">值。</param>
        public ConfigItem(string key, string value)
        {
            key = (key + "").Trim();
            if (key.Length == 0 || key == "=")
                throw new System.Exception("key值不能为空或等号。");
            SectionName = "Others";
            Key = key;
            Value = value;
        }

        /// <summary>
        /// key 若长度小于1，则抛出异常。
        /// value 无限制。
        /// </summary>
        /// <param name="key">主键。</param>
        /// <param name="value">值。</param>
        public ConfigItem(string section, string key, string value)
        {
            key = (key + "").Trim();
            section = (section + "").Trim();
            if (key.Length == 0 || key == "=")
                throw new System.Exception("key值不能为空或等号。");

            SectionName = section.Length > 0 ? section : "Others";
            Key = key;
            Value = value;
        }


        /// <summary>
        /// 返回文本化内容，格式为 LineNo: FieldName.Key=Value
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return $"{SectionName}.{Key}={Value}";
        }

        /// <summary>
        /// 带域名的全键名。
        /// </summary>
        public string FullKey { get { return SectionName + "." + Key; } }

        /// <summary>
        /// 对给定的字符串进行解析。有以下几种情况。
        /// </summary>
        /// <param name="line"></param>
        /// <returns></returns>
        public static ConfigItem Parse(string line)
        {
            string s = (line + "").Trim();
            ConfigItem ci = new ConfigItem();
            // 以 [ 开头的表示是段的切换
            if (s.Length == 0 || s.StartsWith("//") || s.StartsWith("#"))
            {
            }
            else if (s.StartsWith("[") && s.EndsWith("]"))
            {
                s = s.Trim('[', ']').Trim();
                if (s.Length > 1) // 即在[]之间的内容长度至少为1
                {
                    ci.IsSectionName = true;
                    ci.SectionName = s;
                    ci.IsValid = true;
                }
            }
            else
            {
                // 以等号拆分字符串
                int p = s.IndexOf('=');
                if (p > 0) // key的长度至少为1
                {
                    ci.Key = s.Substring(0, p).Trim();
                    ci.Value = s.Substring(p + 1).Trim();
                    ci.IsValid = true;
                }
            }
            return ci;
        }


    }
}